package cn.xuguowen.user.designPatten.factory.simple;

import cn.xuguowen.user.designPatten.factory.pizza.CheesePizza;
import cn.xuguowen.user.designPatten.factory.pizza.DurianPizza;
import cn.xuguowen.user.designPatten.factory.pizza.GreekPizza;
import cn.xuguowen.user.designPatten.factory.pizza.Pizza;

/**
 * ClassName: SimpleFactory
 * Package: cn.xuguowen.user.designPatten.factory.simple
 * Description:
 * 简单工厂：处理了创建对象的细节。这样就解决了具体的披萨产品和抽象披萨类的耦合。
 *         但是也产生了新的耦合：
 *          1.订购披萨类和简单工厂类耦合
 *          2.简单工厂对象和具体的披萨对象耦合
 * 优点：
 *      1.封装了创建对象的过程，可以通过参数直接获取对象。这样把对象的创建过程和业务逻辑分开（一开始创建对象的过程和披萨对象的准备材料、烘烤、切割、打包的业务逻辑分开了）。
 *        这样的话就避免了修改客户代码，如果要实现新的披萨产品直接修改工厂类，而不需要再披萨订购的源代码中修改，这样就降低了客户代码修改的可能性，更加容易扩展。
 * 缺点：
 *      1.增加新产品时还是需要修改简单工厂类的代码，违背了开闭原则
 * @Author 徐国文
 * @Create 2023/4/25 15:30
 * @Version 1.0
 */
public class SimpleFactory {
    /**
     * 简单工厂：根据用户输入的订购类型创建对应类型的披萨
     * @param orderType 披萨类型
     * @return
     */
    public Pizza getPizza(String orderType) {
        Pizza pizza = null;

        if (orderType.equals("greek")) {
            pizza = new GreekPizza();
            pizza.setName(" 希腊披萨 ");
        } else if (orderType.equals("cheese")) {
            pizza = new CheesePizza();
            pizza.setName(" 奶酪披萨 ");
        } else if (orderType.equals("durian")) {        // 榴莲披萨就是新增的，为了演示违背开闭原则，使用简单工厂模式优化
            pizza = new DurianPizza();
            pizza.setName(" 榴莲披萨 ");
        }

        return pizza;
    }
}
